home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
fb386
/
getdir
/
getdir2.asm
< prev
next >
Wrap
Assembly Source File
|
1991-10-18
|
6KB
|
274 lines
; getdir2.asm 91.03.13
; copyright(c)1991 K.Kurosaki
.386p
inter = 0 ; コンパイラのときはコメントに
param struc
dd ? ; eip
p1 dd ? ; p1 機能番号(値)
p2 dd ? ; p2 ファイルパス(アドレス)
p3 dd ? ; p3 ファイル属性(値)
p4 dd ? ; p4 格納文字列個数(アドレス)
p5 dd ? ; p5 格納文字列(アドレス)
param ends
code segment dword public ER use32 'CODE'
assume cs:CODE
getdir proc near
mov ebp,esp
cmp word ptr [ebp].p1,2 ; 機能番号
ja err05 ; 機能番号エラー
xor ecx,ecx
mov ebx,[ebp].p2 ; ファイルパス
mov cx,[ebx+4]
cmp cx,0 ; 文字列長が0
je err07
mov ebx,[ebx] ; 文字列の先頭へ
cmp word ptr [ebp].p1,2
je getdir40 ; カレントディスク,ディレクトリ
getdir06:
cmp byte ptr [ebx],0
je getdir08 ; 最後は0のはず
inc ebx
loop getdir06
jmp err07 ; 最後が0じゃなかった
getdir08:
mov edx,offset dta
mov ah,1ah ; DTAのセット
int 21h
cmp word ptr [ebp].p1,0 ; 機能番号
je getdir12 ; 個数カウントのみ
mov ebx,[ebp].p4
mov ecx,[ebx] ; 格納ファイル数
cmp ecx,0
je err07 ; 領域不足
push ecx
mov ebx,[ebp].p5 ; 格納文字列アドレス
mov ax,2020h ; スペースで埋める
getdir10:
mov edi,[ebx] ; アドレス
mov dx,[ebx+4] ; 長さ
cmp ebx,24
jb err08 ; 24文字未満はエラー
push ecx
mov ecx,12 ; 2バイト×12回
rep stosw
pop ecx
ifdef inter
add ebx,6 ; 次の位置へ(インタプリタ)
else
add ebx,14 ; 次の位置へ(コンパイラ)
endif
loop getdir10
pop ecx
getdir12:
push ecx
mov ebx,[ebp].p2
mov edx,[ebx] ; サーチするファイルパス
mov ecx,[ebp].p3 ; ファイル属性
mov ah,4eh
int 21h ; 最初のサーチ
pop ecx
jc errx10 ; ファイルなし
cmp word ptr [ebp].p1,0
je getdir30 ; カウントのみ
mov ebx,[ebp].p5 ; 格納先配列開始アドレス
call infsave ; ファイル情報の格納
jc err01 ; ファイル形式がおかしい
getdir20:
ifdef inter
add ebx,6 ; 次の配列位置へ(インタプリタ)
else
add ebx,14 ; 次の配列位置へ(コンパイラ)
endif
push ecx
push ebx
mov ah,4fh ; 次のサーチ
int 21h
pop ebx
pop ecx
jc err00 ; 合うファイルがもうない
dec ecx
je err07 ; 格納場所がなくなった
call infsave
jc err01
jmp getdir20
getdir30:
xor ecx,ecx ; ファイル個数カウンタ
getdir32:
inc ecx
push ecx
mov ah,4fh ; 次のサーチ
int 21h
pop ecx
jnc getdir32 ; 合うファイルがもうない
mov ebx,[ebp].p4
mov [ebx],ecx ; ファイル個数
mov eax,0 ; 全ファイルサーチ
ret
getdir40:
cmp ecx,64+3
jb err07 ; 格納文字列の長さが足りない
push ebx
mov ah,19h ; カレントディスクの獲得
int 21h
pop ebx
add al,'A'
mov [ebx],al ; アスキーに直して
mov ax,'\:'
mov [ebx+1],ax
add ebx,3
mov esi,ebx ; デェレクトリの格納先
xor dx,dx ; カレントドライブ指定
mov ah,47h
int 21h
jc err04 ; エラーがあるはずないけど
err00:
mov eax,0 ; 正常終了
jmp errx20
err01:
mov eax,1 ; ファイル名領域不良
jmp errx20
errx10:
mov dx,ax
mov eax,2 ; 対象ファイル無し
cmp dx,12h
je errx12
mov eax,3 ; ファイルパス無効
cmp dx,2h
je errx12
err04:
mov eax,4 ; 未知のファンクションエラー
errx12:
ret
err05:
mov eax,5 ; 機能番号異常
ret
err06:
mov eax,6 ; ファイルパス指定異常
ret
err07:
mov eax,7 ; 領域不足
errx20:
mov ebx,[ebp].p4
mov edx,[ebx]
sub edx,ecx
inc edx
mov [ebx],edx ; ファイル個数
ret
err08:
mov eax,8 ; 文字列長不足
ret
getdir endp
infsave proc near
push ecx
mov esi,offset dta+15h ; PSPのオフセット
mov edi,[ebx]
mov al,[esi] ; 属性
mov [edi],al
mov ax,[esi+1] ; 時刻
mov dx,ax
rol ax,4
and ax,1fh
mov [edi+1],al ; 時
mov ax,dx
shr ax,5
and ax,3fh
mov [edi+2],al ; 分
shl dx,1
and dx,3fh
mov [edi+3],dl ; 秒
mov ax,[esi+3] ; 日時
mov dx,ax
rol ax,7
and ax,7fh
mov [edi+4],al ; 年
mov ax,dx
shr ax,5
and ax,0fh
mov [edi+5],al ; 月
and dx,1fh
mov [edi+6],dl ; 日
mov al,[esi+5] ; ファイルサイズ
mov [edi+10],al
mov al,[esi+6]
mov [edi+9],al
mov al,[esi+7]
mov [edi+8],al
mov al,[esi+8]
mov [edi+7],al
mov esi,offset dta+1eh ; ファイル名
add edi,11
mov ecx,13
infsave10:
mov al,[esi]
inc esi
cmp al,0
je infsave20 ; 最後は0のはず
mov [edi],al
inc edi
loop infsave10
pop ecx
stc ; 最後に0が来なかった
ret
infsave20:
pop ecx
clc ; 正常終了
ret
infsave endp
dta db 256 dup(?)
CODE ends
end